package gcp.testes;

import static org.junit.Assert.assertEquals;
import gcp.Gibi;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GibiEstado;
import gcp.enums.ItemEstado;

import org.junit.Before;
import org.junit.Test;

/**
 * Classe de teste de Gibi
 */
public class GibiTeste {
    private Gibi gibi1, gibi2, gibi3, gibi4;

    /**
     * Criacao de variaveis.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Before
    public void setUp() throws Exception {
        gibi1 = new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, "otimo");
        gibi2 = new Gibi("Homem Aranha", "Marvel Comics", 1985,
                ClassificacaoEtaria.DOZE, ItemEstado.EMPRESTADO,
                GibiEstado.SEM_CAPA, "bom");
        gibi3 = new Gibi("Almanaque Turma da Mônica", "Editora Globo", 1995,
                ClassificacaoEtaria.LIVRE, ItemEstado.COMIGO,
                GibiEstado.RISCADO, "legal");
        gibi4 = new Gibi("Zé Carioca", "Editora Globo", 2009,
                ClassificacaoEtaria.LIVRE, ItemEstado.EMPRESTADO,
                GibiEstado.AMASSADO, "da hora");
    }

    /**
     * Teste gibi com titulo nulo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaTituloNull() throws Exception {
        new Gibi(null, "DC", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("Homem Aranha", "Marvel Comics", 1985,
                ClassificacaoEtaria.DOZE, ItemEstado.EMPRESTADO,
                GibiEstado.SEM_CAPA, null);
    }

    /**
     * Teste de gibi com titulo vazio.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaTituloVazio() throws Exception {
        new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("", "Marvel Comics", 1985, ClassificacaoEtaria.DOZE,
                ItemEstado.EMPRESTADO, GibiEstado.SEM_CAPA, null);
    }

    /**
     * Teste de gibi com quem publicou nulo.
     * @throws Exception Lanaada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaQuemPublicouNulo() throws Exception {
        new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("Homem Aranha", null, 1985, ClassificacaoEtaria.DOZE,
                ItemEstado.EMPRESTADO, GibiEstado.SEM_CAPA, null);
    }

    /**
     * Teste de gibi com quem publicou nulo.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaQuemPublicouVazio() throws Exception {
        new Gibi("Batman", "", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("Homem Aranha", "Marvel Comics", 1985,
                ClassificacaoEtaria.DOZE, ItemEstado.EMPRESTADO,
                GibiEstado.SEM_CAPA, null);
    }

    /**
     * Teste de gibi com ano zero.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAnoZero() throws Exception {
        new Gibi("Batman", "DC", 0, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("Homem Aranha", "Marvel Comics", 1985,
                ClassificacaoEtaria.DOZE, ItemEstado.EMPRESTADO,
                GibiEstado.SEM_CAPA, null);
    }

    /**
     * Teste de gibi com ano negativo
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test(expected = Exception.class)
    public void testaAnoNegativo() throws Exception {
        new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE,
                ItemEstado.FALTANDO, GibiEstado.CONSERVADO, null);
        new Gibi("Homem Aranha", "Marvel Comics", -1930,
                ClassificacaoEtaria.DOZE, ItemEstado.EMPRESTADO,
                GibiEstado.SEM_CAPA, null);
    }

    /**
     * Testa o métodos getTitulo.
     */
    @Test
    public void testaGetTitulos() {
        assertEquals("Batman", gibi1.getTitulo());
        assertEquals("Homem Aranha", gibi2.getTitulo());
        assertEquals("Almanaque Turma da Mônica", gibi3.getTitulo());
        assertEquals("Zé Carioca", gibi4.getTitulo());
    }

    /**
     * Testa os métodos setTitulo e getTitulo
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaSetEGetTitulos() throws Exception {
        gibi1.setTitulo("Homem de Gelo");
        gibi2.setTitulo("Super Homem");
        gibi3.setTitulo("Magali");
        gibi4.setTitulo("Tio Patinhas");
        assertEquals("Homem de Gelo", gibi1.getTitulo());
        assertEquals("Super Homem", gibi2.getTitulo());
        assertEquals("Magali", gibi3.getTitulo());
        assertEquals("Tio Patinhas", gibi4.getTitulo());
    }

    /**
     * Testa o metodo quemPublicou
     */
    @Test
    public void testagetQuemPublicou() {
        assertEquals("DC", gibi1.getQuemPublicou());
        assertEquals("Marvel Comics", gibi2.getQuemPublicou());
        assertEquals("Editora Globo", gibi3.getQuemPublicou());
        assertEquals("Editora Globo", gibi4.getQuemPublicou());
    }

    /**
     * Testa os metodos setQuemPublicou e getQuemPublicou
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaSetEGetQuemPublicou() throws Exception {
        gibi1.setQuemPublicou("Marvel");
        gibi2.setQuemPublicou("DC");
        gibi3.setQuemPublicou("Editora Abril");
        gibi4.setQuemPublicou("Editora Saraiva");
        assertEquals("Marvel", gibi1.getQuemPublicou());
        assertEquals("DC", gibi2.getQuemPublicou());
        assertEquals("Editora Abril", gibi3.getQuemPublicou());
        assertEquals("Editora Saraiva", gibi4.getQuemPublicou());
    }

    /**
     * Testa o metodo getAno
     */
    @Test
    public void testaGetAno() {
        assertEquals(2009, gibi1.getAno());
        assertEquals(1985, gibi2.getAno());
        assertEquals(1995, gibi3.getAno());
        assertEquals(2009, gibi4.getAno());
    }

    /**
     * Testa os metodos setAno e getAno
     * @throws Exception
     */
    @Test
    public void testaSetEGetAno() throws Exception {
        gibi1.setAno(1960);
        gibi2.setAno(1970);
        gibi3.setAno(1980);
        gibi4.setAno(1990);
        assertEquals(1960, gibi1.getAno());
        assertEquals(1970, gibi2.getAno());
        assertEquals(1980, gibi3.getAno());
        assertEquals(1990, gibi4.getAno());
    }

    /**
     * Testa o metodo getErsb
     */
    @Test
    public void testaGetERSB() {
        assertEquals(ClassificacaoEtaria.DOZE, gibi1.getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.DOZE, gibi2.getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.LIVRE, gibi3.getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.LIVRE, gibi4.getClassificacaoEtaria());
    }

    /**
     * Testa os metodos setErsb e getErsb
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaSetEGetErsb() throws Exception {
        gibi1.setClassificacaoEtaria(ClassificacaoEtaria.DESCONHECIDO);
        gibi2.setClassificacaoEtaria(ClassificacaoEtaria.DEZESSEIS);
        gibi3.setClassificacaoEtaria(ClassificacaoEtaria.LIVRE);
        gibi4.setClassificacaoEtaria(ClassificacaoEtaria.DEZOITO);
        assertEquals(ClassificacaoEtaria.DESCONHECIDO, gibi1
                .getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.DEZESSEIS, gibi2
                .getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.LIVRE, gibi3.getClassificacaoEtaria());
        assertEquals(ClassificacaoEtaria.DEZOITO, gibi4
                .getClassificacaoEtaria());
    }

    /**
     * Testa o metodo getItemEstado
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetItemEstado() throws Exception {
        assertEquals(ItemEstado.FALTANDO, gibi1.getItemEstado());
        assertEquals(ItemEstado.EMPRESTADO, gibi2.getItemEstado());
        assertEquals(ItemEstado.COMIGO, gibi3.getItemEstado());
        assertEquals(ItemEstado.EMPRESTADO, gibi4.getItemEstado());
    }

    /**
     * Testa os metodos setItemEstado e getItemEstado
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaSetEGetItemEstado() throws Exception {
        gibi1.setItemEstado(ItemEstado.EMPRESTADO);
        gibi2.setItemEstado(ItemEstado.COMIGO);
        gibi3.setItemEstado(ItemEstado.A_DEVOLVER);
        gibi4.setItemEstado(ItemEstado.FALTANDO);
        assertEquals(ItemEstado.EMPRESTADO, gibi1.getItemEstado());
        assertEquals(ItemEstado.COMIGO, gibi2.getItemEstado());
        assertEquals(ItemEstado.A_DEVOLVER, gibi3.getItemEstado());
        assertEquals(ItemEstado.FALTANDO, gibi4.getItemEstado());
    }

    /**
     * Testa o metodo getGibiEstado
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaGetGibiEstado() throws Exception {
        assertEquals(GibiEstado.CONSERVADO, gibi1.getGibiEstado());
        assertEquals(GibiEstado.SEM_CAPA, gibi2.getGibiEstado());
        assertEquals(GibiEstado.RISCADO, gibi3.getGibiEstado());
        assertEquals(GibiEstado.AMASSADO, gibi4.getGibiEstado());
    }

    /**
     * Testa os metodos setGibiEstado e getGibiEstado
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    @Test
    public void testaSetEGetGibiEstado() throws Exception {
        gibi1.setGibiEstado(GibiEstado.RASGADO);
        gibi2.setGibiEstado(GibiEstado.CONSERVADO);
        gibi3.setGibiEstado(GibiEstado.AMASSADO);
        gibi4.setGibiEstado(GibiEstado.CONSERVADO);
        assertEquals(GibiEstado.RASGADO, gibi1.getGibiEstado());
        assertEquals(GibiEstado.CONSERVADO, gibi2.getGibiEstado());
        assertEquals(GibiEstado.AMASSADO, gibi3.getGibiEstado());
        assertEquals(GibiEstado.CONSERVADO, gibi4.getGibiEstado());
    }
}